const list = [
    { id: 1, name: '羊村', parentId: null },
    { id: 2, name: '喜洋洋', parentId: 1 },
    { id: 3, name: '美洋洋', parentId: 1 },
    { id: 4, name: '狼堡', parentId: null },
    { id: 5, name: '红太狼', parentId: 4 },
    { id: 6, name: '灰太狼', parentId: 4 },
    { id: 7, name: '灰太狼', parentId: 6 },
];


function convertList(list) {
    const res = {};
    // 首先保存id和对象的映射
    const map = list.reduce((total, current) => (total[current.id] = current, total), {})
    // 循环list，根据parentId在Map里取得父节点，
    for (const item of list) {
        // 如果为空则是根节点，直接放入res, 这里给的结果需要去掉parentId属性
        if (item.parentId === null) {
            delete item.parentId;
            res.push(item);
            continue;
        }
        // 如果map中存在，获取并把当前节点作为其孩子
        if (item.parentId in map) {
            const parent = map[item.parentId]
            // 如果检查是否有children属性，就直接push当前的子节点，如果没有就添加children属性。
            parent.children = parent.children || []
            delete item.parentId;
            parent.children.push(item);
        }
    }
    return res

}

let result = convertList(list);
console.log(result);
